package ProyectoX;

import java.awt.BorderLayout;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

/**
 * Clase Pulpo extiende NaveEnemiga
 *
 */
public class Pulpo extends NaveEnemiga {
	
	private int tinta = 0;
	private boolean lance;
	private int aumento;
	private boolean apareci;
	
	/**
	 * Constructor Pulpo
	 * @param n Nivel
	 */
	public Pulpo(Nivel n) {
		super(0,20,5,200, n);
		
		this.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Pulpo.png")));
		this.setBounds(0, 0, getIcon().getIconWidth(), getIcon().getIconHeight());
		
		lance = false;
		aumento = 0;
		apareci = false;
	}

	/**
	 * Mueve el pulpo
	 */
	public void Mover() {
		if(this.getX()+ this.getWidth()/2 > MiNivel.obtenerAnchoNivel() && ! apareci){
			this.setLocation(this.getX() - 3, this.getY());
		}
		else{
			apareci = true;
			Random r = new Random();
			int p = r.nextInt(4);			
			Mover(p);		
		}
	}
	
	/**
	 * Mueve el pulpo segun el parametro i 
	 * Si la cantidad de golpes recibidos es impar lanzaTinta
	 */
	public void Mover(int i){
		tinta ++;
		
		if (this.isVisible()){
		switch (i) {
		case 0:
			while (this.getX() > MiNivel.obtenerAnchoNivel()/2){
				this.setLocation(this.getX() - 2,this.getY());
				tinta ++;
				try {
					Thread.sleep(25);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			break;
		case 1:
			while (this.getX() < MiNivel.obtenerAnchoNivel()- this.getWidth()/2){
				this.setLocation(this.getX() + 2,this.getY());
				tinta ++;
				try {
					Thread.sleep(25);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			break;
		case 2:
			while (this.getY() < MiNivel.obtenerAltoNivel() - this.getHeight()){
				this.setLocation(this.getX(),this.getY()+2);
				tinta ++;
				try {
					Thread.sleep(25);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			break;
		case 3:
			while (this.getY() >  0){
				this.setLocation(this.getX(), this.getY() - 2);
				tinta ++;
				try {
					Thread.sleep(25);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			break;
		}
		
		if (tinta > 50){
			for (int i2= 0 ; i2<10; i2++){
				
				if (estaEnPantalla()){
					//Crea un random que setea la direccion a la que va a mover la tinta
					Random r = new Random();
					int m = r.nextInt(3);
					lanzarTinta(m);
				}
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			aumento += 3;
			
			tinta = 0;
			
		}
		
		if(cantGolpes % 2 == 1 && !lance){
			lanzarPowerUp();
			lance = true;
		}
		}
	}
	
	/**
	 * Crea un powerup, lo agrega al nivel
	 *  y a la lista de powerups.
	 */
	private void lanzarPowerUp(){
		PowerUp pu = new PowerUp(MiNivel, this);
		int x = (this.getX() - this.getWidth()/2 - pu.getWidth());
		pu.setBounds(x, this.getY()+ (this.getIcon().getIconHeight()/2 - 2), pu.getIcon().getIconWidth(), pu.getIcon().getIconHeight());
		MiNivel.agregarComponente(pu);
		MiNivel.obtenerPowerUps().add(pu);
		
		AutoRemovePowerUp a= new AutoRemovePowerUp(pu, MiNivel.juego.jPanelNivel);
		a.start();
	}

	/**
	 * Crea tinta y le setea longitud
	 * Setea el movimiento de tinta
	 * La agrega al nivel y a la lista de armas enemigas
	 * @param k entero
	 */
	public void lanzarTinta(int k){
		ArmaEnemiga t = new Tinta(MiNivel, this);
		((Tinta)t).setLong(aumento);
		
		int x= (this.getX() + this.getWidth()/2);
		t.setBounds(x, this.getY()+ (this.getIcon().getIconHeight()/2 ), t.getIcon().getIconWidth(), t.getIcon().getIconHeight());
		
		MiNivel.agregarComponente(t);
		MiNivel.obtenerArmasEnemigas().add(t);
		
		((Tinta)t).setMov(k);
	}
	
	/**
	 * @return Verdadero si aparecio
	 * Falso en caso contrario
	 */
	public boolean estaEnPantalla(){
		if (apareci)
		//Pulpo siempre esta en panalla porque sus movimeintos estan acotados dentro de la misma.
			return true;
		else 
			return false;
	}
	
	/**
	 * Setea pulpo en no visible
	 * Setea todo en no visible
	 * @return puntosAlMorir
	 */
	public int Morir() {
		
		this.setVisible(false);
		
		MiNivel.Terminar();
		
		return puntosAlMorir;
	}
	
	/**
	 * @return Verdadero si colisionan los objetos
	 * Falso en caso contrario.
	 */
	public boolean alcanzoObjeto(Dibujable d){
		
		boolean colisionan = false;
		if(this.estaEnPantalla() && d.estaEnPantalla()){
		colisionan = (d.getX()> this.getX()+(this.getWidth()/4) && (d.getX()+d.getWidth()<this.getX()+this.getWidth()));
		}
		return colisionan;
		
	}
	
	/**
	 * Verifica si pulpo y nave jugador colisionaron
	 * De ser asi , pulpo ataca a nave jugador.
	 * Si esta nave jugador no vive terminar el nivel
	 */
	protected synchronized void Colisiones(){

		if(this.estaEnPantalla()){
			if(MiNivel.obtenerNaveJugador().alcanzoObjeto(this)){
				
				this.Atacar(MiNivel.obtenerNaveJugador());
				
				if(! MiNivel.obtenerNaveJugador().vive()){
					MiNivel.Terminar();
				}
			}		
		}
	}
	
	/**
	 * Incrementa cantidad de golpes
	 * Setea imagen del pulpo
	 * @return ret
	 */
	public int serAtacado(){
		cantGolpes++;
		lance = false;
		int ret= 0;
		if(cantGolpes < cantMaxGolpes && cantGolpes>5)
			ret= 50;
		else{
			if(cantGolpes == cantMaxGolpes)
				ret = puntosAlMorir;
		}
		
		
		JLabel atacado = new JLabel();
		atacado.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/PulpoAtacado.png")));
		MiNivel.juego.jPanelNivel.add(atacado);
		this.setVisible(false);
		atacado.setBounds(getX(), getY(), atacado.getIcon().getIconWidth(), atacado.getIcon().getIconHeight());
		AutoRemoveEnem a = new AutoRemoveEnem(atacado, MiNivel.juego.jPanelNivel);
		a.start();
		
		this.setVisible(true);
		
		
		
		return ret;
	}
	
}
